#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int g_val=100;

int main()
{
    pid_t id = fork();
    if(id == 0)
    {
      // child
        int flag = 0;
        while(1)
        {
            printf("我是子进程: %d, ppid: %d, g_val: %d, &g_val: %p\n\n", getpid(), getppid(), g_val, &g_val);
            sleep(1);
            ++flag;
            if(flag == 3)
            {
                g_val = 200;
                printf("子进程已修改全局数据!\n");
            }
        }
    }
    else
    {
        // parent
        while(1)
        {
            printf("我是父进程: %d, ppid: %d, g_val: %d, &g_val: %p\n\n", getpid(), getppid(), g_val, &g_val);
            sleep(2);
        }
    }
    return 0;
}

//int un_g_val;
//int g_val=100;
//
//int main(int argc, char* argv[], char* env[])
//{
//    printf("code addr         : %p\n", main);
//    printf("init global addr  : %p\n", &g_val);
//    printf("uninit global addr: %p\n", &un_g_val);
//    char* m1 = (char*)malloc(100);
//    char* m2 = (char*)malloc(100);
//    char* m3 = (char*)malloc(100);
//    char* m4 = (char*)malloc(100);
//    static int s = 100;
//    printf("heap addr         : %p\n", m1);
//    printf("heap addr         : %p\n", m2);
//    printf("heap addr         : %p\n", m3);
//    printf("heap addr         : %p\n", m4);
//
//    printf("stack addr        : %p\n", &m1);
//    printf("stack addr        : %p\n", &m2);
//    printf("stack addr        : %p\n", &m3);
//    printf("stack addr        : %p\n", &m4);
//    printf("s stack addr      : %p\n", &s);
//    int i = 0;
//    for(i = 0; i < argc; ++i)
//    {
//        printf("argv addr     : %p\n", argv[i]);
//    }
//
//    for (i = 0; env[i]; ++i)
//    {
//        printf("env addr      : %p\n", env[i]);
//    }
////    while(1)
////    {
////        printf("hello myproc!, pid: %d, ppid: %d, myenv=%s\n", getpid(), getppid(), getenv("qx"));
////        sleep(1);
////    }
//
//    return 0;
//}
